package com.zc.mychart.model;

import android.graphics.Color;

import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.CandleEntry;
import com.github.mikephil.charting.data.Entry;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/2/26 0026.
 */

public class MACDEntrys {
    private List<Entry> DEAs;
    private List<Entry> DIFs;
    private List<BarEntry> MACDs;
    private List<Integer> barColors;

    /**
     * 以EMA1的参数为12日EMA2的参数为26日，DIF的参数为9日为例来看看MACD的计算过程
     * 1、计算移动平均值（EMA）
     * 12日EMA的算式为
     * EMA（12）=前一日EMA（12）×11/13+今日收盘价×2/13
     * 26日EMA的算式为
     * EMA（26）=前一日EMA（26）×25/27+今日收盘价×2/27
     * 2、计算离差值（DIF）
     * DIF=今日EMA（12）－今日EMA（26）
     * 3、计算DIF的9日EMA
     * 根据离差值计算其9日的EMA，即离差平均值，是所求的MACD值。为了不与指标原名相混淆，此值又名
     * DEA或DEM。
     * 今日DEA（MACD）=前一日DEA×8/10+今日DIF×2/10计算出的DIF和DEA的数值均为正值或负值。
     * 用（DIF-DEA）×2即为MACD柱状图。
     *
     * @param list
     */
    public MACDEntrys(List<CandleEntry> list) {
        DEAs = new ArrayList<>();
        DIFs = new ArrayList<>();
        MACDs = new ArrayList<>();
        barColors = new ArrayList<>();

        float ema12 = 0.0f;
        float ema26 = 0.0f;
        float close = 0f;
        float dif = 0.0f;
        float dea = 0.0f;
        float macd = 0.0f;
        float x = 0f;
        if (list != null) {
            for (int i = 0; i < list.size(); i++) {
                close = list.get(i).getClose();
                if (i == 0) {
                    ema12 = close;
                    ema26 = close;
                } else {
                    ema12 = ema12 * 11 / 13 + close * 2 / 13;
                    ema26 = ema26 * 25 / 27 + close * 2 / 27;
                }
                dif = ema12 - ema26;
                dea = dea * 8 / 10 + dif * 2 / 10;
                macd = (dif - dea) * 2;
                x = list.get(i).getX();
                DEAs.add(new Entry(x, dea));
                DIFs.add(new Entry(x, dif));
                MACDs.add(new BarEntry(x, macd));
                if (macd >= 0) {
                    barColors.add(Color.parseColor("#FFF54337"));
                } else {
                    barColors.add(Color.parseColor("#FF0FBC62"));
                }
            }
        }
    }

    public List<Entry> getDEAs() {
        return DEAs;
    }

    public List<Entry> getDIFs() {
        return DIFs;
    }

    public List<BarEntry> getMACDs() {
        return MACDs;
    }

    public List<Integer> getBarColors() {
        return barColors;
    }
}
